package pl.edu.agh.mobsys.data;

import java.util.Arrays;

/**
 * Pomaga w zabawie z utrwalaniem kontaktów - enkpsuluje ich generyczność.
 * */
public class ContactFactory {

	private static final String SEPARATOR = "###";

	/**
	 * Odczyt kontaktu na podstawie aliasu i zakodowanej konfiguracji
	 * 
	 * @param alias
	 * @param data
	 *            - konfiguracja z preferencji
	 * 
	 * @return odpowieni kontakt, nigdy null
	 * */
	public static Contact buildContact(String alias, String data) {
		Contact c = null;

		// konfiguracja jest zakodowana jako string z elementami oddzielonymi
		// separatorem (zupełnie jak csv) - ich ilość determinuje typ kontaktu :
		// smoa lub nie smoa

		String[] dd = data.split(SEPARATOR);
		for (int i = 0; i < dd.length; ++i) {
			if ("null".equals(dd[i])) { // konieczny odczyt nulli
				dd[i] = null;
			}
		}

		if (dd.length == 4) {
			c = new SmoaContact(dd[0], dd[1], dd[2], dd[3]);
		} else if (dd.length == 2) {
			c = new PersonalContact(dd[0], dd[1]);
		} else {
			new Exception("Wrong SMOA contact data encoding: "
					+ Arrays.toString(dd)).printStackTrace();

			// informacja o błędach
			c = new PersonalContact("error", "error");
		}

		c.setAlias(alias);
		return c;
	}

	/**
	 * Zakodowanie konfiguracji kontaktu.
	 * */
	public static String encodeContact(Contact c) {

		// wszystkie pola oddzielone separatorami
		if (c instanceof PersonalContact) {
			PersonalContact pc = ((PersonalContact) c);
			return pc.getXmppName() + SEPARATOR + pc.getResource();
		} else if (c instanceof SmoaContact) {
			SmoaContact sc = (SmoaContact) c;
			return sc.getNotifierXmppName() + SEPARATOR
					+ sc.getJobReceiverXmppName() + SEPARATOR
					+ sc.getNotifierResource() + SEPARATOR
					+ sc.getJobReceiverResource();
		}
		return null;
	}

}
